# Specifické příkazy pro prostředí Google Colab
if 'google.colab' in str(get_ipython()):
import os, sys
os.chdir('/content')
# Stažení knihovny
! ls parlamentikon || git clone "https://github.com/parlamentikon/parlamentikon.git" --branch main
os.chdir('/content/parlamentikon/notebooks')
instalace_zavislosti = True
if instalace_zavislosti:
! pip install -r ../requirements.txt 1>/dev/null
instalace_knihovny = False
if instalace_knihovny:
! pip install .. 1>/dev/null
else:
# Přidání cesty pro lokální import knihovny
import sys, os
sys.path.insert(0, os.path.abspath('..'))
from datetime import datetime
import plotly.graph_objects as go
import pandas as pd
import numpy as np
from parlamentikon.Hlasovani import Hlasovani, ZpochybneniHlasovani
from nastav_notebook import nastav_pandas
# Data se budou pokaždé znovu stahovat z achivu PS
stahni=True
# Budeme analyzovat poslední volební období
zvolene_volebni_obdobi = None
# Načti souhrnné informace o hlasováních
h = Hlasovani(stahni=stahni, volebni_obdobi=zvolene_volebni_obdobi)
h.head(2)
2021-05-09:03:17:02 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip'. 2021-05-09:03:17:03 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/hl-2017ps.zip'.
| id_hlasovani | id_organ | schuze | cislo | bod | cas | pro | proti | zdrzel | nehlasoval | ... | kvorum | nazev_dlouhy | nazev_kratky | datum | bod__KAT | vysledek | druh_hlasovani | ma_zpochybneni | je_zmatecne | ma_stenozaznam | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 67018 | 172 | 1 | 1 | 3 | 13:53:00 | 191 | 0 | 5 | 0 | ... | 99 | Inf. o ustavení volební komise PS a volbě členů | <NA> | 2017-11-20 13:53:00+01:00 | normální | přijato | normální | False | True | False |
| 1 | 67019 | 172 | 1 | 2 | 3 | 13:53:00 | 194 | 0 | 4 | 0 | ... | 100 | Inf. o ustavení volební komise PS a volbě členů | <NA> | 2017-11-20 13:53:00+01:00 | normální | přijato | normální | False | False | False |
2 rows × 21 columns
# Načti informace o zpochybnění hlasování
zph = ZpochybneniHlasovani(stahni=stahni, volebni_obdobi=zvolene_volebni_obdobi)
zph.head(2)
2021-05-09:03:17:07 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip'. 2021-05-09:03:17:08 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/hl-2017ps.zip'.
| id_hlasovani | turn | mode | id_h2 | id_h3 | mode__KAT | je_platne | id_organ | schuze | cislo | ... | vysledek__ORIG | nazev_dlouhy | nazev_kratky | datum | bod__KAT | vysledek | druh_hlasovani | ma_zpochybneni | je_zmatecne | ma_stenozaznam | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 55680 | 67 | 0 | 55681 | 55682 | žádost o opakování | True | <NA> | <NA> | <NA> | ... | <NA> | <NA> | <NA> | NaT | <NA> | <NA> | <NA> | NaN | NaN | NaN |
| 1 | 55664 | 43 | 0 | 55665 | 55666 | žádost o opakování | True | <NA> | <NA> | <NA> | ... | <NA> | <NA> | <NA> | NaT | <NA> | <NA> | <NA> | NaN | NaN | NaN |
2 rows × 30 columns
volebni_obdobi = h.volebni_obdobi
print(f"Poslanecká sněmovna bude analyzovaná pro volební období {volebni_obdobi}.")
Poslanecká sněmovna bude analyzovaná pro volební období 2017.
def flatten(ary):
return [x for l in ary for x in l]
# Hlasování o zpochybnění hlasování je možné také zkazit nebo zpochybnit.
# Mezi prvním hlasováním o zpochybnění a opakovaným hlasováním může proběhnout několik dalších zpochybněných nebo neplatných hlasování.
def fce_mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovanim_ids(row):
if pd.isna(row['id_h2']):
return []
elif pd.isna(row['id_h3']):
return []
else:
return list(range(row['id_h2']+1, row['id_h3']))
zpochybneni = zph[zph.je_platne == True]
mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovani_ids = \
flatten(zpochybneni[zpochybneni.mode__KAT == 'žádost o opakování'].apply(fce_mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovanim_ids, axis=1))
hlasovani_o_zpochybneni_ids = h[h.id_hlasovani.isin(zpochybneni.id_h2.unique())]
hlasovani_bez_zmatecnych_a_zpochybnenych = h[~h.je_zmatecne
& ~h.id_hlasovani.isin(zph[zph.mode__KAT == 'žádost o opakování'].id_hlasovani)
& ~h.id_hlasovani.isin(mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovani_ids)
& ~h.id_hlasovani.isin(hlasovani_o_zpochybneni_ids)
]
h_platne = hlasovani_bez_zmatecnych_a_zpochybnenych.copy()
h_platne["mira_jednomyslnosti"] = (h_platne.pro - h_platne.proti).abs() / (h_platne.pro + h_platne.proti)
h_platne["mira_jednomyslnosti"].describe()
fig = go.Figure(go.Histogram(
x=h_platne.mira_jednomyslnosti,
hovertemplate="míra jednomyslnosti: %{x}<br>počet hlasování: %{y}<extra></extra>"))
fig.update_layout(width=700, height=400, xaxis=dict(title="míra jednomyslnosti"), yaxis=dict(title="počet hlasování"))
fig.show()
# denní míra jednomyslnosti
precision = 3
def A_razeno_dle_B(x, A, B):
df = x.groupby(A)[B].mean().sort_values(ascending=True)
return("<br>".join(map(str, df.index.astype(str) + ': ' + df.values.round(precision).astype(str))))
days = 7
interval = f"{days}D"
df = pd.DataFrame()
df['mira_jednomyslnosti_za_den_mean'] = h_platne.groupby(h_platne.datum.dt.date).mira_jednomyslnosti.mean()
df['nazev_dlouhy_za_den'] = h_platne.groupby(h_platne.datum.dt.date)[['nazev_dlouhy', 'mira_jednomyslnosti']].apply(
lambda x: A_razeno_dle_B(x, "nazev_dlouhy", "mira_jednomyslnosti")
)
df.index = pd.to_datetime(df.index)
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df.index,
y=df.mira_jednomyslnosti_za_den_mean,
text=df.nazev_dlouhy_za_den,
name="míra jednomyslnosti za den",
mode="markers",
marker=dict(
size=5,
color=df.mira_jednomyslnosti_za_den_mean,
colorscale='RdYlGn', # one of plotly colorscales
showscale=True
),
hovertemplate =
'<b>%{x}</b>'+
'<br><br><b>Průměrná míra jednomyslnosti</b>: <i>%{y:.3f}</i>'+
'<br><br><b>Hlasování dle míry jednomyslnosti (vzestupně):</b><br>%{text}<extra></extra>',
hoverlabel=dict(
bgcolor='white',
font=dict(color='black')
)
))
fig.update_layout(title="Denní míra jednomyslnosti", xaxis=dict(title="datum [jednotlivé dny]"), yaxis=dict(title="míra jednomyslnosti"))
fig.show()
print(f"Jednomyslně schválená hlasování (vysoká míra jednomyslnosti): {h_platne[h_platne.mira_jednomyslnosti == 1].index.size}")
jednomyslna_temata = h_platne[h_platne.mira_jednomyslnosti == 1].groupby('nazev_dlouhy').size().sort_values(ascending=False)
print(jednomyslna_temata.head(20))
Jednomyslně schválená hlasování (vysoká míra jednomyslnosti): 3242
nazev_dlouhy
Pořad schůze 594
138
Návrh na vyslovení souhlasu PS s prodloužením doby nouzového stavu 83
Návrh na změny ve složení orgánů Poslanecké sněmovny 61
Návrhy PS na propůjčení nebo udělení státních vyznamenání 44
Novela z. - občanský soudní řád 36
Vl.n.z. v souv.s elektronizací postupů orgánů veřejné moci 33
Novela z. - školský zákon 26
Návrhy Poslanecké sněmovny na propůjčení nebo udělení státních vyzname 24
Novela z. o kompenzačním bonusu 23
Novela z. o daních z příjmů 23
Novela z. - trestní řád 23
Novela z. o státním rozpočtu ČR na rok 2020 22
Vl. n. z. kterým se mění některé zákony v oblasti daní - EU 20
Novela z. o státní sociální podpoře 20
Usn.PS.1162 18
Vl.n.z. o evidenci skutečných majitelů - EU 18
Novela z. o provozu na pozemních komunikacích 17
Novela z. - trestní zákoník - EU 17
Novela z. o pomoci v hmotné nouzi 16
dtype: int64
print(f"Hlasování s nízkou mírou jednomyslnosti (zcela vyrovnané pro a proti)): {h_platne[h_platne.mira_jednomyslnosti == 0].index.size}")
nejednomyslna_temata = h_platne[h_platne.mira_jednomyslnosti == 0].groupby('nazev_dlouhy').size().sort_values(ascending=False)
print(nejednomyslna_temata.head(20))
Hlasování s nízkou mírou jednomyslnosti (zcela vyrovnané pro a proti)): 73 nazev_dlouhy Novela z. o evidenci tržeb - EU 28 Pořad schůze 7 Vl.n.z. o kompenzačním bonusu v souv. s krizovými opatřeními 5 Novela z. o rozpočtových pravidlech 2 Novela z. - horní zákon 2 Vl.n.z.o opatř.ke zmírnění dopadů SARS CoV-2 na nájemce byt. 2 Návrh na vyslovení nedůvěry vládě České republiky 2 Vl.n.z. o státním rozpočtu ČR na rok 2021 2 Novela z. o pomoci v hmotné nouzi 1 Novela z. o potravinách a tabákových výrobcích - EU 1 Vln. z. o kompenzačním bonusu pro rok 2021 1 Novela z. o některých úpravách v oblasti evidence tržeb 1 Novela z. o vnitrozemské plavbě - EU 1 Novela z. o evidenci tržeb 1 Novela z. o důchodovém pojištění 1 Novela z. o bankách - EU 1 N.z., kterým se mění zák. opatření Senátu č. 340/2013 Sb. 1 Novela z. o státním občanství ČR 1 Novela z. úpravách ošetřovného 1 Novela z. o vodách (vodní zákon) - EU 1 dtype: int64
# Témata hlasování s nejvyšší mírou jednomyslnosti a jejich počty
cnt = 5
x = pd.DataFrame()
x['celkovy_pocet_hlasovani_dle_tematu'] = h_platne.groupby('nazev_dlouhy').size()
x['prumerna_mira_jednomyslnosti_dle_tematu'] = h_platne.groupby('nazev_dlouhy')['mira_jednomyslnosti'].mean()
x.sort_values(by='prumerna_mira_jednomyslnosti_dle_tematu', ascending=False).head(cnt)
| celkovy_pocet_hlasovani_dle_tematu | prumerna_mira_jednomyslnosti_dle_tematu | |
|---|---|---|
| nazev_dlouhy | ||
| Výroční zpráva Českého telekomunikačního úřadu za rok 2017 | 1 | 1.0 |
| Prot. o udržitelném zemědělství a rozvoji venkova | 3 | 1.0 |
| Písemná interpelace I. Bartoše na A. Schillerovou ve věci zprávy o fin | 1 | 1.0 |
| Písemná interpelace J. Farského na K. Havlíčka ve věci demolice drážní | 2 | 1.0 |
| Novela z. o zdravotnických prostředcích | 2 | 1.0 |
# Témata hlasování s nízkou mírou jednomyslnosti a jejich počty
cnt = 5
x = pd.DataFrame()
x['celkovy_pocet_hlasovani_dle_tematu'] = h_platne.groupby('nazev_dlouhy').size()
x['prumerna_mira_jednomyslnosti_dle_tematu'] = h_platne.groupby('nazev_dlouhy')['mira_jednomyslnosti'].mean()
x.sort_values(by='prumerna_mira_jednomyslnosti_dle_tematu', ascending=False).tail(cnt)
| celkovy_pocet_hlasovani_dle_tematu | prumerna_mira_jednomyslnosti_dle_tematu | |
|---|---|---|
| nazev_dlouhy | ||
| Písemná interpelace V. Munzara na A. Schillerovou | 1 | 0.083333 |
| Novela z. o evidenci tržeb - EU | 857 | 0.060626 |
| Písemná interpelace V. Munzara na A. Schillerovou ve věci poruš. ústav | 1 | 0.054054 |
| Písemná interpelace V. Munzara na A. Schillerovou ve věci odměňování ú | 1 | 0.038961 |
| Návrh na vyslovení nedůvěry vládě České republiky | 3 | 0.022556 |
print(f"Poslední běh notebooku: {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}.")
Poslední běh notebooku: 09.05.2021 03:17:13.